package info.openlvb.openface.server.ldap;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/*
 * Cree le 12 dec. 2003
 *
 * Fonctions utilitaires pour le cryptage MD5
 * Encode une chaine et renvoi son resultat crypte en
 * hexadecimal avec l'algorithme MD5 ou test
 * une chaine et une valeur crypte. Main d'exemple fourni.
 */

/**
 * @author Gaelle
 *
 * Version : 1.0
 * Last update : 12/12/2003
 */

public class MD5Password{
	/*
# * Encode la chaine passe en paramètre avec l'algorithme MD5
# *
# * @param key : la chaine à encoder
# *
# * @return la valeur (string) hexadecimale sur 32 bits
# */
	public static String getEncodedPasswordMD5(String key) {
		byte[] uniqueKey = key.getBytes();
		byte[] hash = null;
		try {
			hash = MessageDigest.getInstance("MD5").digest(uniqueKey);
		} catch (NoSuchAlgorithmException e) {
			throw new Error("no MD5 support in this VM");
		}
		StringBuffer hashString = new StringBuffer();
		for ( int i = 0; i < hash.length; ++i ) {
			String hex = Integer.toHexString(hash[i]);
			if ( hex.length() == 1 ) {
				hashString.append('0');
				hashString.append(hex.charAt(hex.length()-1));
			} else {
				hashString.append(hex.substring(hex.length()-2));
			}
		}
		return hashString.toString();
	}
	public static String getEncodedPasswordSHA(String key) {
		byte[] uniqueKey = key.getBytes();
		byte[] hash = null;
		try {
			hash = MessageDigest.getInstance("SHA-1").digest(uniqueKey);
		} catch (NoSuchAlgorithmException e) {
			throw new Error("no SHA support in this VM");
		}
		return hash.toString();
	}

	/*
	 * Test une chaine et une valeur encode (chaine hexadecimale)
	 *
	 * @param clearTextTestPassword : la chaine non code à tester
	 * @param encodedActualPassword : la valeur hexa MD5 de reference
	 *
	 * @return true si verifie false sinon
	 */
	public static boolean testPassword(String clearTextTestPassword,
			String encodedActualPassword)
	throws NoSuchAlgorithmException
	{
		String encodedTestPassword = MD5Password.getEncodedPasswordMD5(
				clearTextTestPassword);

		return (encodedTestPassword.equals(encodedActualPassword));
	}

	/*
	 * Un exemple bete d'utilisation
	 */
	public static void main(String[] args) {
		System.out.println(getEncodedPasswordMD5("toto"));
		try {
			if (testPassword("mot de passe", "729f2d8b3d3d9bc07ba349faab7fdf44"))
				System.out.println("Les passwords sont verifies");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
} 